﻿using System;
using System.Data;
using MySql.Data.MySqlClient;
using SiGeCoPre.Presupuesto_Conexion;
using SiGeCoPre.Presupuesto_Entities;
using SiGeCoPre.Presupuesto_Excepcion;
using SiGeCoPre.Presupuesto_Util;

namespace SiGeCoPre.Presupuesto_DAOIMPL
{
    /// <summary>
    /// Clase que implementa DAOEquipo
    /// </summary>
    class DAOIMPLEquipo:Presupuesto_DAO.DAOEquipo
    {
        /// <summary>
        /// Guarda un equipo
        /// </summary>
        /// <param name="tipo_equipo">Tipo de equipo</param>
        /// <param name="motor_principal">Motor principal del equipo</param>
        /// <param name="equipo_hidraulico">Equipo hidraulico del equipo</param>
        /// <param name="bomba_hidraulica">Bomba hidraulica del equipo</param>
        /// <param name="sensores">Sensores del equipo</param>
        /// <param name="sistema_enfriamiento">Sistema de enfriamiento del equipo</param>
        /// <param name="filtros">Filtros del equipo</param>
        /// <param name="sistema_recirculacion">Sistema de recirculacion del equipo</param>
        /// <param name="largo">Largo del equipo</param>
        /// <param name="ancho">Ancho del equipo</param>
        /// <param name="inclinacion_maxima">Inclinación máxima del equipo</param>
        /// <param name="capacidad_descarga">Capacidad de descarga del equipo</param>
        /// <param name="calzas">Calzas del equipo</param>
        /// <param name="ubicacion_cilindros">Ubicación de los cilindros del equipo</param>
        /// <param name="capacidad_operativa">Capacidad operativa del equipo</param>
        /// <param name="instalacion_hidraulica">Instalación hidraulica del equipo</param>
        /// <param name="instalacion_electrica">Instalación eléctrica del equipo</param>
        /// <param name="detalle_cilindros">Detalle de los cilindros del equipo</param>
        /// <param name="detalle_extras">Detalles extras del equipo</param>
        /// <param name="activo">Determina si está activo en la base de datos</param>
        /// <returns>Devuelve true si fue ingresado correctamente o false si falló</returns>
        public bool saveEquipo(string tipo_equipo, string motor_principal, string equipo_hidraulico, string bomba_hidraulica, string sensores, string sistema_enfriamiento, string filtros, string sistema_recirculacion, string largo, string ancho, string inclinacion_maxima, string capacidad_descarga, string calzas, string ubicacion_cilindros, string capacidad_operativa, string instalacion_hidraulica, string instalacion_electrica, string detalle_cilindros, string detalle_extras, bool activo)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand insertar = conexion.CreateCommand();
                insertar.CommandText = "INSERT INTO equipo(tipo_equipo, motor_principal, equipo_hidraulico, bomba_hidraulica, sensores, sistema_enfriamiento, filtros, sistema_recirculacion, largo, ancho, inclinacion_maxima, capacidad_descarga, calzas, ubicacion_cilindros, capacidad_operativa, instalacion_hidraulica, instalacion_electrica, detalle_cilindros, detalle_extras, activo)"
                                        + " VALUES(@tipo_equipo, @motor_principal, @equipo_hidraulico, @bomba_hidraulica, @sensores, @sistema_enfriamiento, @filtros, @sistema_recirculacion, @largo, @ancho, @inclinacion_maxima, @capacidad_descarga, @calzas, @ubicacion_cilindros, @capacidad_operativa, @instalacion_hidraulica, @instalacion_electrica, @detalle_cilindros, @detalle_extras, @activo)";
                insertar.Parameters.AddWithValue("@tipo_equipo", tipo_equipo);
                insertar.Parameters.AddWithValue("@motor_principal", motor_principal);
                insertar.Parameters.AddWithValue("@equipo_hidraulico", equipo_hidraulico);
                insertar.Parameters.AddWithValue("@bomba_hidraulica", bomba_hidraulica);
                insertar.Parameters.AddWithValue("@sensores", sensores);
                insertar.Parameters.AddWithValue("@sistema_enfriamiento", sistema_enfriamiento);
                insertar.Parameters.AddWithValue("@filtros", filtros);
                insertar.Parameters.AddWithValue("@sistema_recirculacion", sistema_recirculacion);
                insertar.Parameters.AddWithValue("@largo", largo);
                insertar.Parameters.AddWithValue("@ancho", ancho);
                insertar.Parameters.AddWithValue("@inclinacion_maxima", inclinacion_maxima);
                insertar.Parameters.AddWithValue("@capacidad_descarga", capacidad_descarga);
                insertar.Parameters.AddWithValue("@calzas", calzas);
                insertar.Parameters.AddWithValue("@ubicacion_cilindros", ubicacion_cilindros);
                insertar.Parameters.AddWithValue("@capacidad_operativa", capacidad_operativa);
                insertar.Parameters.AddWithValue("@instalacion_hidraulica", instalacion_hidraulica);
                insertar.Parameters.AddWithValue("@instalacion_electrica", instalacion_electrica);
                insertar.Parameters.AddWithValue("@detalle_cilindros", detalle_cilindros);
                insertar.Parameters.AddWithValue("@detalle_extras", detalle_extras);
                insertar.Parameters.AddWithValue("@activo", activo);
                insertar.ExecuteNonQuery();
                correcto = true;
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Guarda un equipo
        /// </summary>
        /// <param name="tipo_equipo">Tipo de equipo</param>
        /// <param name="motor_principal">Motor principal del equipo</param>
        /// <param name="equipo_hidraulico">Equipo hidraulico del equipo</param>
        /// <param name="bomba_hidraulica">Bomba hidraulica del equipo</param>
        /// <param name="sensores">Sensores del equipo</param>
        /// <param name="sistema_enfriamiento">Sistema de enfriamiento del equipo</param>
        /// <param name="filtros">Filtros del equipo</param>
        /// <param name="sistema_recirculacion">Sistema de recirculacion del equipo</param>
        /// <param name="largo">Largo del equipo</param>
        /// <param name="ancho">Ancho del equipo</param>
        /// <param name="inclinacion_maxima">Inclinación máxima del equipo</param>
        /// <param name="capacidad_descarga">Capacidad de descarga del equipo</param>
        /// <param name="calzas">Calzas del equipo</param>
        /// <param name="ubicacion_cilindros">Ubicación de los cilindros del equipo</param>
        /// <param name="capacidad_operativa">Capacidad operativa del equipo</param>
        /// <param name="instalacion_hidraulica">Instalación hidraulica del equipo</param>
        /// <param name="instalacion_electrica">Instalación eléctrica del equipo</param>
        /// <param name="detalle_cilindros">Detalle de los cilindros del equipo</param>
        /// <param name="detalle_extras">Detalles extras del equipo</param>
        /// <param name="activo">Determina si está activo en la base de datos</param>
        /// <param name="id">Determina el equipo a modificar</param>
        /// <returns>Devuelve true si fue ingresado correctamente o false si falló</returns>
        public bool updateEquipo(string tipo_equipo, string motor_principal, string equipo_hidraulico, string bomba_hidraulica, string sensores, string sistema_enfriamiento, string filtros, string sistema_recirculacion, string largo, string ancho, string inclinacion_maxima, string capacidad_descarga, string calzas, string ubicacion_cilindros, string capacidad_operativa, string instalacion_hidraulica, string instalacion_electrica, string detalle_cilindros, string detalle_extras, bool activo, int id)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand modificar = conexion.CreateCommand();
                modificar.CommandText = "UPDATE equipo SET tipo_equipo = @tipo_equipo, motor_principal = @motor_principal, equipo_hidraulico = @equipo_hidraulico, bomba_hidraulica = @bomba_hidraulica, sensores = @sensores, sistema_enfriamiento = @sistema_enfriamiento, filtros = @filtros, sistema_recirculacion = @sistema_recirculacion, largo = @largo, ancho = @ancho, inclinacion_maxima = @inclinacion_maxima, capacidad_descarga = @capacidad_descarga, calzas = @calzas, ubicacion_cilindros = @ubicacion_cilindros, capacidad_operativa = @capacidad_operativa, instalacion_hidraulica = @instalacion_hidraulica, instalacion_electrica = @instalacion_electrica, detalle_cilindros = @detalle_cilindros, detalle_extras = @detalle_extras, activo = @activo WHERE id = @id";
                modificar.Parameters.AddWithValue("@tipo_equipo", tipo_equipo);
                modificar.Parameters.AddWithValue("@motor_principal", motor_principal);
                modificar.Parameters.AddWithValue("@equipo_hidraulico", equipo_hidraulico);
                modificar.Parameters.AddWithValue("@bomba_hidraulica", bomba_hidraulica);
                modificar.Parameters.AddWithValue("@sensores", sensores);
                modificar.Parameters.AddWithValue("@sistema_enfriamiento", sistema_enfriamiento);
                modificar.Parameters.AddWithValue("@filtros", filtros);
                modificar.Parameters.AddWithValue("@sistema_recirculacion", sistema_recirculacion);
                modificar.Parameters.AddWithValue("@largo", largo);
                modificar.Parameters.AddWithValue("@ancho", ancho);
                modificar.Parameters.AddWithValue("@inclinacion_maxima", inclinacion_maxima);
                modificar.Parameters.AddWithValue("@capacidad_descarga", capacidad_descarga);
                modificar.Parameters.AddWithValue("@calzas", calzas);
                modificar.Parameters.AddWithValue("@ubicacion_cilindros", ubicacion_cilindros);
                modificar.Parameters.AddWithValue("@capacidad_operativa", capacidad_operativa);
                modificar.Parameters.AddWithValue("@instalacion_hidraulica", instalacion_hidraulica);
                modificar.Parameters.AddWithValue("@instalacion_electrica", instalacion_electrica);
                modificar.Parameters.AddWithValue("@detalle_cilindros", detalle_cilindros);
                modificar.Parameters.AddWithValue("@detalle_extras", detalle_extras);
                modificar.Parameters.AddWithValue("@activo", activo);
                modificar.Parameters.AddWithValue("id", id);
                modificar.ExecuteNonQuery();
                correcto = true;
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Elimina un equipo
        /// </summary>
        /// <param name="id">Determina el equipo a eliminar</param>
        /// <returns>Devuelve true si fue eliminado correctamente o false si falló</returns>
        public bool deleteEquipo(int id)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand eliminar = conexion.CreateCommand();
                eliminar.CommandText = "UPDATE equiopo SET Activo = @activo WHERE id = @id";
                eliminar.Parameters.AddWithValue("@activo", 0);
                eliminar.Parameters.AddWithValue("@id", id);
                eliminar.ExecuteNonQuery();
                correcto = true;
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Lista los equipos
        /// </summary>
        /// <returns>Devuelve una tabla con todos los equipos</returns>
        public DataTable getAllEquipos()
        {
            DataTable equipos = new DataTable();
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand listado = conexion.CreateCommand();
                listado.CommandText = "SELECT * FROM equipo";
                MySqlDataAdapter adaptador = new MySqlDataAdapter(listado);
                adaptador.Fill(equipos);

                adaptador.Dispose();
                conexion.Close();
                conexion.Dispose();

            }
            catch (Exception ex)
            {
                equipos = null;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return equipos;
        }

        /// <summary>
        /// Obtiene un equipo
        /// </summary>
        /// <param name="id">Determina el equipo a obtener</param>
        /// <returns>Devuelve un objeto equipo</returns>
        public equipo getEquipo(int id)
        {
            equipo e = new equipo();
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand consulta = conexion.CreateCommand();
                consulta.CommandText = "SELECT * FROM equipo WHERE id = @id";
                consulta.Parameters.AddWithValue("@id", id);
                MySqlDataReader lector = consulta.ExecuteReader();
                while (lector.Read())
                {
                    
                    e.Activo = Convert.ToBoolean(lector["activo"].ToString());
                    e.Ancho = lector["ancho"].ToString();
                    e.BombaHidraulica = lector["bomba_hidraulica"].ToString();
                    e.Calzas = lector["calzas"].ToString();
                    e.CapacidadDescarga = lector["capacidad_descarga"].ToString();
                    e.CapacidadOperativa = lector["capacidad_operativa"].ToString();
                    e.DetalleCilindros = lector["detalle_cilindros"].ToString();
                    e.DetalleExtras = lector["detalle_extras"].ToString();
                    e.EquipoHidraulico = lector["equipo_hidraulico"].ToString();
                    e.Filtros = lector["filtros"].ToString();
                    e.ID = Convert.ToInt16(lector["id"].ToString());
                    e.InclinacionMaxima = lector["inclinacion_maxima"].ToString();
                    e.InstalacionElectrica = lector["instalacion_electrica"].ToString();
                    e.InstalacionHidraulica = lector["instalacion_hidraulica"].ToString();
                    e.Largo = lector["largo"].ToString();
                    e.MotorPrincipal = lector["motor_principal"].ToString();
                    e.Sensores = lector["sensores"].ToString();
                    e.SistemaEnfriamiento = lector["sistema_enfriamiento"].ToString();
                    e.SistemaRecirculacion = lector["sistema_recirculacion"].ToString();
                    e.TipoEquipo = lector["tipo_equipo"].ToString();
                    e.UbicacionCilindros = lector["ubicacion_cilindros"].ToString();
                    
                }
                lector.Close();
                lector.Dispose();
                conexion.Close();
                conexion.Dispose();

            }
            catch (Exception ex)
            {
                e = null;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return e;
        }

        /// <summary>
        /// Obtiene el indice más alto de la tabla equipos
        /// </summary>
        /// <returns>Devuelve un entero con el valor del indice</returns>
        public int getMaxId()
        {
            int id = 0;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand consulta = conexion.CreateCommand();
                consulta.CommandText = "SELECT MAX(id) FROM equipo";
                MySqlDataReader lector = consulta.ExecuteReader();
                while (lector.Read())
                {
                    id = Convert.ToInt16(lector["MAX(id)"].ToString());
                }
                lector.Close();
                lector.Dispose();
                conexion.Close();
                conexion.Dispose();

            }
            catch (Exception ex)
            {
                id = 0;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return id;
        
        }
    }
}
